1   /*
2    * Copyright (C) 2011 The Guava Authors
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5    * in compliance with the License. You may obtain a copy of the License at
6    *
7    * http://www.apache.org/licenses/LICENSE-2.0
8    *
9    * Unless required by applicable law or agreed to in writing, software distributed under the
10   * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
11   * express or implied. See the License for the specific language governing permissions and
12   * limitations under the License.
13   */
14  
15  package com.google.common.collect;
16  
17  import javax.annotation.Nullable;
18  
19  /**
20   * A skeletal implementation of {@code RangeSet}.
21   *
22   * @author Louis Wasserman
23   */
24  abstract class AbstractRangeSet<C extends Comparable> implements RangeSet<C> {
25    AbstractRangeSet() {}
26  
27    @Override
28    public boolean contains(C value) {
29      return rangeContaining(value) != null;
30    }
31  
32    @Override
33    public abstract Range<C> rangeContaining(C value);
34  
35    @Override
36    public boolean isEmpty() {
37      return asRanges().isEmpty();
38    }
39  
40    @Override
41    public void add(Range<C> range) {
42      throw new UnsupportedOperationException();
43    }
44  
45    @Override
46    public void remove(Range<C> range) {
47      throw new UnsupportedOperationException();
48    }
49    
50    @Override
51    public void clear() {
52      remove(Range.<C>all());
53    }
54  
55    @Override
56    public boolean enclosesAll(RangeSet<C> other) {
57      for (Range<C> range : other.asRanges()) {
58        if (!encloses(range)) {
59          return false;
60        }
61      }
62      return true;
63    }
64  
65    @Override
66    public void addAll(RangeSet<C> other) {
67      for (Range<C> range : other.asRanges()) {
68        add(range);
69      }
70    }
71  
72    @Override
73    public void removeAll(RangeSet<C> other) {
74      for (Range<C> range : other.asRanges()) {
75        remove(range);
76      }
77    }
78  
79    @Override
80    public abstract boolean encloses(Range<C> otherRange);
81  
82    @Override
83    public boolean equals(@Nullable Object obj) {
84      if (obj == this) {
85        return true;
86      } else if (obj instanceof RangeSet) {
87        RangeSet<?> other = (RangeSet<?>) obj;
88        return this.asRanges().equals(other.asRanges());
89      }
90      return false;
91    }
92  
93    @Override
94    public final int hashCode() {
95      return asRanges().hashCode();
96    }
97  
98    @Override
99    public final String toString() {
100     return asRanges().toString();
101   }
102 }